Use case: DMA2D transfer blending interrupt mode

Sequence diagram

DMA2D transfer blending interrupt mode.

@startuml
' To add a number by line
'autonumber

' Fix order of each column
participant "Application" as user
participant "DMA2D Driver" as dma2d
participant "DMA2D IRQ" as irq
participant "HW" as hw

== DMA2D Initialization and Configuration ==
user -> dma2d : HAL_DMA2D_Init()
dma2d --> user : HAL_OK or HAL_INVALID_PARAM
user -> dma2d : HAL_DMA2D_ConfigLayer(&hdma2d, 0)
dma2d --> user :
user -> dma2d : HAL_DMA2D_ConfigLayer(&hdma2d, 1)
dma2d --> user :
== DMA2D Transfer Process ==
user -> dma2d : HAL_DMA2D_BlendingStart_IT()
dma2d --> user :
hw -> irq : Interrupt
irq -> dma2d : HAL_DMA2D_IRQHandler()
dma2d -> user : Transfer complete or transfer error callback

@enduml

Code snippet

HAL1

HAL2

DMA2D_HandleTypeDef hdma2d;





/* DMA2D init configuration */
hdma2d.Instance = DMA2D;

hdma2d.Init.Mode = DMA2D_M2M_BLEND;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
hdma2d.Init.RedBlueSwap = DMA2D_RB_REGULAR;
hdma2d.Init.OutputOffset = 0x0;
hdma2d.Init.AlphaInverted = DMA2D_REGULAR_ALPHA;
hdma2d.Init.BytesSwap = DMA2D_BYTES_REGULAR;

hdma2d.XferCpltCallback  = HAL_DMA2D_CL_TransferCpltCallback;
hdma2d.XferErrorCallback = HAL_DMA2D_CL_XferErrorCallback;

/* Foreground Configuration */

hdma2d.LayerCfg[1].AlphaMode = DMA2D_REPLACE_ALPHA;
hdma2d.LayerCfg[1].InputAlpha = 0xFF;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
hdma2d.LayerCfg[1].InputOffset = 0x0;
hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;

/* Background Configuration */

hdma2d.LayerCfg[0].AlphaMode = DMA2D_REPLACE_ALPHA;
hdma2d.LayerCfg[0].InputAlpha = 0xFF;
hdma2d.LayerCfg[0].InputColorMode = DMA2D_INPUT_RGB565;
hdma2d.LayerCfg[0].InputOffset = 0x0;
hdma2d.LayerCfg[0].RedBlueSwap = DMA2D_RB_REGULAR;
hdma2d.LayerCfg[0].AlphaInverted = DMA2D_REGULAR_ALPHA;


HAL_DMA2D_Init(&hdma2d);



HAL_DMA2D_ConfigLayer(&hdma2d, 0);
HAL_DMA2D_ConfigLayer(&hdma2d, 1);
HAL_DMA2D_BlendingStart_IT(&hdma2d, (uint32_t)&RGB565_64x80_1,
                           (uint32_t)&RGB565_64x80_2,LCD_FRAME_BUFFER, 64, 80);
hal_dma2d_handle_t hdma2d;

/* DMA2D initialization */

HAL_DMA2D_Init(&hdma2d, HAL_DMA2D);

/* DMA2D output configuration */

p_config.output.p_dest = (void *) OUTPUT_FRAME_BUFFER;

p_config.output.color_mode = HAL_DMA2D_OUTPUT_COLOR_ARGB8888;

p_config.output.offset = 0x0;





/* Foreground Configuration */
p_config.fg_input.p_src = (void const*) (uint32_t)&RGB565_64x80_1;
p_config.fg_input.alpha_mode   = HAL_DMA2D_INPUT_ALPHA_REPLACE;
p_config.fg_input.alpha_value  = 0xFF;
p_config.fg_input.color_mode   = HAL_DMA2D_INPUT_COLOR_RGB565;
p_config.fg_input.offset   = 0;



/* Background Configuration */
p_config.bg_input.p_src = (void const*) (uint32_t)&RGB565_64x80_2;
p_config.bg_input.alpha_mode   = HAL_DMA2D_INPUT_ALPHA_REPLACE;
p_config.bg_input.alpha_value  = 0xFF;
p_config.bg_input.color_mode   = HAL_DMA2D_INPUT_COLOR_RGB565;
p_config.bg_input.offset   = 0;


p_config.width = 64;
p_config.height = 80;

HAL_DMA2D_RegisterXferCpltCallback(&hdma2d, HAL_DMA2D_TransferComplete);
HAL_DMA2D_RegisterErrorCallback(&hdma2d, HAL_DMA2D_TransferError);

HAL_DMA2D_SetConfigBlending(&hdma2d, &p_config);

HAL_DMA2D_Start_IT(&hdma2d);

Key changes

  1. In HAL2, blending transfers are configured using HAL_DMA2D_SetConfigBlending() and started using HAL_DMA2D_Start_IT().

  2. HAL2 provides dedicated registration APIs for the transfer-complete and error callbacks.